
\chapter{RESULTADOS}
\thispagestyle{empty}

\par Neste capítulo serão discutidos, por meio de uma aplicação teórica e
prática os resultados que foram obtidos durante o desenvolvimento deste
projeto.

\par O desenvolvimento deste trabalho foi norteado pelo objetivo geral, que é o
desenvolvimento de uma aplicação de recomendação de filmes utilizando um banco
de dados orientado a grafos, tendo como base os objetivos específicos, propondo
uma forma diferenciada de relacionar informações utilizando o conceito de grafo.

\par Com o desenvolvimento da aplicação, foi possível entender o funcionamento
de um banco orientado a grafos, utilizando recursos da linguagem Java para a
manipulação de dados. É uma abordagem diferente, pois não é necessário converter
o modelo orientado a objetos para que possa ser implementado em um banco de
dados com tabelas e chaves estrangeiras. Com o uso da API do Neo4j foi possível utilizar o banco dentro
da aplicação fazendo com que a aplicação e o banco de dados tenham a mesma
estrutura, facilitando no desenvolvimento. 

\par Com a conclusão do processo de desenvolvimento da aplicação obteve-se
um \textit{software} para uma locadora de filmes que possui como principal
funcionalidade a recomendação de filmes. 
%Na página inicial da aplicação é disponibilizado para o usuário um \textit{link} para cadastrar-se e para entrar em sua conta.
A Figura~\ref{fig:tela_ini} ilustra a
página inicial da aplicação, onde é disponibilizado para o usuário um \textit{link} para
cadastrar-se e para entrar em sua conta.

\begin{figure}[h!]
  \centerline{\includegraphics[scale=0.8]{./imagens/tela_inicial.png}}
  \caption[Tela inicial.]{Tela inicial.
  \textbf{Fonte:}
  Elaborado pelos Autores}
\label{fig:tela_ini}
\end{figure}

\par Há duas possibilidades de usuário, Admin e Usuário comum. A entrar como
Admin, é carregada a tela de gerenciamento onde são disponibilizadas as
opções de cadastro e visualização dos dados que estão cadastrados no banco. A
tela para o Usuário exibe as opções de visualização de dados e locação de
filmes, além da recomendação de filmes.

\par A tela principal de gerenciamento, ilustrada na Figura~\ref{fig:tela_geren}, exibe dois menus, um para cadastro e outro para visualização. Com estas opções o administrador pode efetuar o cadastro de filmes, atores e diretores e ainda pode consultar informações presentes no sistema.

\begin{figure}[h!]
  \centerline{\includegraphics[scale=0.8]{./imagens/tela_geren.png}}
  \caption[Tela de gerenciamento.]{Tela de gerenciamento.
  \textbf{Fonte:}
  Elaborado pelos Autores}
\label{fig:tela_geren}
\end{figure}

\par Uma funcionalidade importante é o cadatro de filmes. No processo de criação
de um filme, são criados três tipos de relacionamentos: o \texttt{SERVED},
\texttt{DIRECTED} e o \texttt{BELONGS}, que são fundamentais para a criação das
recomendações. Na Figura~\ref{fig:tela_cadFilme} é ilustrada a tela onde é feito o
cadastro de um filme. Para auxiliar o cadastro, são carregadas duas listas, uma
de atores e outra de diretores, que são retornadas de uma consulta no banco de dados.

\begin{figure}[h!]
  \centerline{\includegraphics[scale=0.55]{./imagens/tela_cadFilme.png}}
  \caption[Tela de para cadastro de filme.]{Tela de para cadastro de filme.
  \textbf{Fonte:}
  Elaborado pelos Autores}
\label{fig:tela_cadFilme}
\end{figure}

\par A Figura~\ref{fig:tela_grafoFilme} exibe um dado armazendo no banco Neo4j,
a visualização é proveniente de uma ferramenta disponibilizada pela NeoTecnology, chamada
Neoclipse. Com ela é possível observar que o filme, o diretor, o gênero e os
atores são representados por vértices que são conectados por arestas
proporcionando acesso a todas informações pertinentes ao filme.

\begin{figure}[h!]
 \centerline{\includegraphics[scale=0.4]{./imagens/tela_grafoFilme.png}}
\caption[Filme cadastrado no banco]{Filme cadastrado no banco.
 \textbf{Fonte:} Elaborado pelos autores}
\label{fig:tela_grafoFilme}
\end{figure}

\par Com os filmes cadastrados, possibilita o usuário interagir 
com o sistema fazendo locações de filmes. Para ter aceso como usuário
é necessário realizar um cadastro simples informando o \textit{e-mail} e uma senha. Depois
de cadastrado, o usuário tem acesso à interface de interação onde são
disponibilizados os serviços de locação, consulta e recomendação de
filmes.

 \par Ao alugar um filme, o sistema cria um relacionamento entre o usuário e o
filme. Este relacionamento é o ponto principal para que o sistema de
recomendações funcione adequadamente, pois o vértice de usuário é usado como \textit{start
node} na travessia do grafo. Na Figura~\ref{fig:tela_grafoFilme_rela} é
ilustrada uma representação do banco de dados, onde pode ser observado o relacionamento 
do tipo \texttt{WATCHED} criando entre o usuário ``andre'' e o filme ``homem de ferro 3''. 

\begin{figure}[h!]
 \centerline{\includegraphics[scale=0.5]{./imagens/tela_recomendacao_grafo.jpg}}
\caption[Relacionamento criado entre o usuario e o filme]{Relacionamento criado
entre o usuario e o filme.
 \textbf{Fonte:}
 Elaborado pelos autores}
\label{fig:tela_grafoFilme_rela}
\end{figure}

\par Após o usuário realizar a primeira locação, o sistema já fornece algumas
recomendações de acordo com o gênero e os atores que atuaram no filme alugado.
Comparando a Figura~\ref{fig:tela_grafoFilme_rela} com a
Figura~\ref{fig:tela_grafoFilme_rela_rec} é possível observar que os filmes
que possuem o mesmo gênero do filme alugado pelo usuário são exibidos na
recomendação de filmes.

\begin{figure}[h!]
 \centerline{\includegraphics[scale=0.5]{./imagens/tela_recomendacao.jpg}}
\caption[Recomendação do sistema para o usuário]{Recomendação do sistema para o
usuário.
 \textbf{Fonte:}
 Elaborado pelos autores}
\label{fig:tela_grafoFilme_rela_rec}
\end{figure}


\par Estes resultados fazem com que o objetivo geral do projeto seja atingido e
que este novo conceito em armazenamento de dados seja melhor compreendido dentro
do escopo definido pelo projeto. Com isso, no próximo capítulo os resultados
obtidos serão discutidos afim de esclarecer pontos importantes sobre a pesquisa.

\section{Discussão de resultados} 

\par Para utilizar o banco de dados orientado a grafos Neo4J dentro da aplicação, foi
necessário criar uma instância interna do banco para acessar aos dados persistidos. 
Por este motivo, cada método que realiza uma consulta ou alteração no banco, deve ter esta instância. 
Inicialmente a classe responsável pelo fornecimento desta instância, a \texttt{Connection} 
foi implementada com um construtor público e com um método que criava esta instância. 
Ao testar esta classe dentro da aplicação, pôde-se
verificar que o tempo para cada operação de acesso ao banco estava relativamente
alto e que o Neo4j não permite que sejam criadas duas instâncias do banco ao
mesmo tempo, o que inviabilizaria a implementação do projeto em um ambiente \textit{web}, e até
mesmo em uma aplicação em que tem-se acesso concorrente ao banco.

\par Para ajustar a aplicação ao contexto proposto, a lógica da classe
\texttt{Connection} teve que ser alterada. Para isso, esta classe foi transformada em um  
\textit{singleton}, que é um \textit{Design Pattern} utilizado para que dentro da
aplicação exista somente uma instânciada dela. Assim
todas as classes DAO têm acesso à mesma instância da classe
\texttt{Connection}, adiquirido através do método \texttt{getInstance()},
visto que o padrão define que o construtor seja privado. Mas isso ainda não
garante que apenas uma instância do banco seja utilizada na aplicação, para isso
o comando responsável pela criação da instância foi retirado do método
\texttt{newGraphDatabase()} e alocado no construtor da classe. Assim o
método apenas retorna a instância através do objeto global \texttt{graph}.

\par Essa solução possibilita dois usuários interagindo simultaneamente com
a aplicação sem que esta seja interrompida por uma \textit{exception} e
ainda reduziu exponencialmento o tempo gasto em cada interação com o banco que
era em média $2,5~s$ (dois segundos e meio) e passou a ser de $50~ms$ (cinquenta
milisegundos), um tempo que reflete a melhora no desempenho.

\par Um ponto interessante do banco é que, a cada vértice ou aresta criados, é
atribuído a eles um ID serial único. Toda instância do banco possui um vértice
com $ID = 0$, denominado de referência, como pode ser visto na
Figura~\ref{fig:vertice_ref}.

\begin{figure}[h!]
 \centerline{\includegraphics[scale=0.6]{./imagens/vertice_referencia.png}}
\caption[Vértice de referência]{Vértice de referência.
 \textbf{Fonte:}
 Elaborado pelos autores}
\label{fig:vertice_ref}
\end{figure}

\par Este ID pode ser usado na recuperação de dados sem ser necessário informar
o índice do vértice procurado, dando mais flexibilidade à consulta.

\par O foco principal do projeto é a recomendação de filmes, visando demostrar
uma das principais funcionalidades do Neo4j que é o \textit{framework Traversal}. A
princípio a compreensão do conceito não pareceu ser trivial, mas com o
desenvolvimento do projeto foi possível compreender e adequar o conceito ao
projeto para que alcançar o resultado esperado. Foram feitos vários testes
com várias variáveis, e depois de definidas quais seriam as recomendações que
o sistema deveria processar, foram implementadas e submtidas a testes na
aplicação. 

\par Após a realização dos testes, os resultados obtidos foram satisfatórios.
Começando pelo CRUD, cada um dos processos foi executado com facilidade, com
ressalvas o processo de exclusão de um vértice, que gerou alguns problemas por
ser necessário excluir todos os relacionamento antes. A codificação dos métodos
segue quase sempre o mesma estrutura, o que facilita o entendimento e a
implementação, além de serem utilizadas poucas classes da API agilizando o
processo de aprendizagem.

\par A travessia realizada pelo banco possui resultados expressivos. Como
o grafo é percorrido completamente, as travessias sempre são executadas em um
tempo constante, independente da quantidade de vértices que serão retornados.
Foi observado nas travessias feitas no projeto que o vértice mais visitado é
colocado no topo da lista, o que é essencial para a lógica de recomendação
empregada no projeto. Supondo um cenário em que o usuário já tenha assitido a
dois filmes que possuem dois atores em comum o ``ator A'' e o ``ator B''. O ``ator
A'' participou, além dos filmes assistidos pelo usuário, do ``filme 3'' e do
``filme 4'' e o ``ator B'' participou também ``filme 4''. Ao solicitar uma
recomendação de filme para este usuário os filmes recomendados serão o ``filme
4'' e o ``filme 3'', nesta ordem. Veja que mesmo o dois atores tendo participado
do ``filme 4'' ele será apresentado somente uma vez no resultado, mas por ser
percorrido duas vezes ele é o primeiro da lista de recomendações.
 
A Figura~\ref{fig:imgtelarecomendacaodefilme}
exibe a tela com uma recomendação de filmes para um determinado usuário, tomando como referência
os gêneros assistidos. 

\begin{figure}[ht!]
  \centerline{\includegraphics[scale=.38]{./imagens/img_sistema_recomendacao.png}}
  \caption[Tela de recomendação de filmes]{Tela de recomendação de filmes. \textbf{Fonte:} Elaborado
  pelos autores}
\label{fig:imgtelarecomendacaodefilme}
\end{figure}

\par Com a finalização da discussão de resultados observa-se que o sistema
atende aos requisitos especificados, com isso no próximo capítulo encontra-se a
conclusão do projeto de pesquisa. 
